package com.scpii.universal.hibernate.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * universalWeb
 * 
 * @author liuhj 2012-7-5上午10:43:01
 * @param <T>
 * @param <PK>
 */
public interface BaseDao<T, PK extends Serializable> {
	/**
	 * 根据ID获取实体对象
	 * 
	 * @param id
	 * @return 实体对象
	 * @author liuhj 2012-7-5上午10:46:02
	 */
	public T get(PK id);

	/**
	 * 根据ID获取实体对象
	 * 
	 * @param id
	 * @return 实体对象
	 * @author liuhj 2012-7-5上午10:48:22
	 */
	public T load(PK id);

	/**
	 * 获取所有实体对象集合
	 * 
	 * @return 实体对象集合
	 * @author liuhj 2012-7-5上午10:50:51
	 */
	public List<T> getAll();

	/**
	 * 根据属性名和值获取实体对象
	 * 
	 * @param propertyName
	 *            属性名
	 * @param value
	 *            属性值
	 * @return 实体对象
	 * @author liuhj 2012-7-5上午10:54:15
	 */
	public T get(String propertyName, Object value);

	/**
	 * 根据属性名和值获取实体对象集合
	 * 
	 * @param propertyName
	 *            属性名
	 * @param value
	 *            属性值
	 * @return 实体对象集合
	 * @author liuhj 2012-7-5上午10:56:19
	 */
	public List<T> getList(String propertyName, Object value);

	/**
	 * 获取总记录数
	 * 
	 * @return 记录数
	 * @author liuhj 2012-7-5上午10:57:32
	 */
	public Long getTotalCount();

	/**
	 * 保存对象
	 * 
	 * @param obj
	 * @author liuhj 2012-7-5上午10:49:32
	 */
	public PK save(T obj);

	/**
	 * 更新实体对象
	 * 
	 * @param obj
	 * @author liuhj 2012-7-5上午11:00:10
	 */
	public void update(T obj);

	/**
	 * 删除实体对象
	 * 
	 * @param entity
	 * @author liuhj 2012-7-5上午11:01:14
	 */
	public void delete(T obj);

	/**
	 * 根据ID删除实体对象
	 * 
	 * @param id
	 *            实体对象ID
	 * @author liuhj 2012-7-5上午11:02:04
	 */
	public void delete(PK id);

	// /================================== HQL
	// ==================================
	/**
	 * 根据HQL，获得对象列表
	 * 
	 * @param namedHqlQuery
	 * @param argsMap
	 * @return List<T>
	 * @throws Exception
	 * @author 甘建新 2012-6-26下午04:56:34
	 */
	public List<T> hqlGetList(final String hql,
			final Map<String, Object> argsMap);

	/**
	 * 根据HQL，做更新操作（更新，修改，删除）
	 * 
	 * @param namedHqlQuery
	 * @param argsMap
	 * @throws Exception
	 * @author 甘建新 2012-6-26下午04:56:55
	 */
	public void hqlUpdate(String namedHqlQuery, Map<String, Object> argsMap);

	/**
	 * 根据HQL，获得数量
	 * 
	 * @param namedHqlQuery
	 * @param argsMap
	 * @return Long
	 * @throws Exception
	 * @author 甘建新 2012-6-26下午04:55:49
	 */
	public Long hqlGetNums(String namedHqlQuery, Map<String, Object> argsMap);

	// ================================== SQL ==================================
	/**
	 * 根据sql语句，获得对象列表
	 * 
	 * @param sqls
	 * @param argsMap
	 * @return List<T>
	 * @throws Exception
	 * @author 甘建新 2012-6-26下午04:53:38
	 */
	public List<T> sqlGetList(String sqls, Map<String, Object> argsMap);

	/**
	 * 根据sql语句，做更新操作（更新，新增，删除）
	 * 
	 * @param sqls
	 * @param argsMap
	 * @throws Exception
	 * @author 甘建新 2012-6-26下午04:58:39
	 */
	public void sqlUpdate(String sqls, Map<String, Object> argsMap);

	/**
	 * 根据sql，获得数据
	 * 
	 * @param sqls
	 * @param argsMap
	 * @return Long
	 * @throws Exception
	 * @author 甘建新 2012-6-26下午04:59:28
	 */
	public Long sqlGetNum(String sqls, Map<String, Object> argsMap);

	/**
	 * 根据sql，获得数据
	 * 
	 * @param sqlName
	 * @param argsMap
	 * @return
	 * @author weny 2012-7-12下午10:22:09
	 */
	public Integer getRecordNum(String sqlName, Map<String, Object> argsMap);

	/**
	 * 根据HQL实现增删改操作
	 * 
	 * @param hql
	 * @param argsMap
	 * @author liuhj 2012-7-9下午05:45:20
	 */
	public void hqlOperation(final String hql, final Map<String, Object> argsMap);

	/**
	 * 获取分页信息
	 * 
	 * @param hql
	 * @param pageNo
	 * @param pageSize
	 * @param map
	 * @return
	 * @author zhangqiaing 2012-7-10下午02:38:48
	 */
	public List<T> findByHql(final String hql, final int pageNo,
			final int pageSize, final Map<String, Object> map);

	/**
	 * 必须有相应的构造函数，及顺序要一致
	 * 
	 * @param properties
	 * @return
	 * @author liuhj 2012-7-16下午12:33:56
	 */
	public String generateHqlByProperties(String[] properties);

	/**
	 * 用于执行Oracle的自定义函数
	 * 
	 * @param proFuncSql
	 * @param argsMap
	 * @return
	 * @author 甘建新 2012-9-21下午05:16:35
	 */
	public List executeFunction(String proFuncSql, Map<String, Object> argsMap);

	/**
	 * 刷新缓存数据
	 */
	public void flushAndClear();

	public List<T> findByHql(final String hql, final int pageNo,
			final int pageSize, final Map<String, Object> map,
			final List<Integer> ids);

	public List<Long> findByHqlCount(final String hql, final int pageNo,
			final int pageSize, final Map<String, Object> map,
			final List<Integer> ids);

	public List getObjectByHql(String queryName, Map<String, Object> argsMap)
			throws Exception;

	public void updateByHql(String namedHql, Map<String, Object> argsMap)
			throws Exception;
}
